"""
selenium 元素定位方式:
    id
    name
    class
    tag_name
    link text
    partial link text
    xpath
    css_selector
其中:
    css_selector 最推荐
        当有id时 , 也建议适用 css_selector 进行元素定位 , ( #id )
    其次是 xpath
        xpath 定位比较通用 , 别的定位方式定位不到的时候 , xpath 往往能够定位到 .
        css_selector 不好逆推定位 , 而 xpath 可以逆推定位 .
        css_selector 是样式定位 , 而 xpath 是从头到尾进行遍历 , 因此 , css_selector 定位比 xpath 要快 .



css_selector 定位规则:

    #id                         根据 id 定位 ( id为"xxx" , 则通过 #xx 即可定位到 )
    .class                      根据 class 定位 ( class为"xxx" , 则通过 .xxx 即可定位到 )

    element1 element2           element1 内部的所有 element2
    element1>element2           父元素为 element1 的所有 element2
    element1,element2           选择 element1 和 element2 ( div,a ---- 选择所有的 div 和 a 元素 )
    element1+element2           选择紧接在 element1 之后的 element2 元素 ( div+a ---- 选择所有 div 之后的 a 元素 )
    element1~element2           选择前面是 element1 的所有 element2 ( p~a 选择前面有 p 元素的每个 a 元素 )

    element:nth-child(n)        选择属于父元素第 n 子元素的 element 元素 . ( a:nth-child(2) 其父元素第二子元素的所有 a 元素 )


    a[href='/sales']            定位 a 标签 href 属性为 '/sales' 的 a 标签 ( 可以在 [] 中指定属性 )
    a[href='/sales'] span       根据 href 定位到 a , 再定位到 a 下的 span 标签.
    a[href='/sales']>span       根据 href 定位到 a , 再定位到 a 子孙中的 span 标签 .
                                ---- 示例来源于 懂车帝首页 , 排行榜元素 ----

    [attribute]             [name]	               表示带有name属性的
    [attribute=value]       [name='wd']	           表示name属性值为wd的
    [attribute~=value]      [class~=bg]	           表示class属性中包含bg的
    [attribute|=value]      [calss|=bg]	           表示class属性以bg开头的
    [attribute^=value]      a[src^='https']	       表示src以https开头的每个<a>
    [attribute$=value]      a[src$=.png]	       表示src以.png结尾的所有<a>
    [attribute*=value]      span[class*="s_ipt"]   表示class属性中包含s_ipt的

    a:link          选择所有未被访问的链接
    a:visited       选择所有已被访问的链接
    a:active        选择活动链接
    a:hover         选择鼠标指针位于其上的链接
    input:focus     选择获得焦点的 input 元素

    p:first-letter  选择每个 p 元素的首字母
    p:first-line    选择每个 p 元素的首行
    p:first-child   选择属于父元素的第一个子元素的每个 p 元素
    p:before        在每个 p 元素的内容之前插入内容
    p:after         在每个 p 元素的之后插入内容
    p:lang(it)      选择带有 it 开头的 lang 属性的每个 p 元素
    p~ul            选择前面有 p 元素的每个 ul 元素
    a[src^='https']	       表示src以https开头的每个<a>
    a[src$=.png]	       表示src以.png结尾的所有<a>
    span[class*="s_ipt"]   表示class属性中包含s_ipt的
    p:first-of-type        选择属于其父元素的首个 p 元素的每个 p 元素
    p:last-of-type         选择属于其父元素的最后 p 元素的每个 p 元素
    p:only-of-type         选择属于其父元素唯一的 p 元素的每个 p 元素
    p:inly-child           选择属于其父元素的唯一子元素的每个 p 元素
    p:nth-child(2)         选择属于其父元素的第二个子元素的每个 p 元素
    p:nth-last-child(2)    选择属于其父元素的最后一个子元素的每个 p 元素
    p:nth-of-type(2)       选择属于其父元素第二个 p 元素的每个 p 元素
    p:nth-last-of-type(2)  选择属于其父元素的倒数第二个 p 元素的每个 p 元素
    p:last-child           选择属于其父元素最后一个子元素每个 p 元素
    :root                  选择文档的跟元素
    p:empty                选择没有子元素的每个 p 元素
    #news:target           选择当前活动的 #news 元素
    input:enabled          选择每个启用的 input 元素
    input:disabled         选择每个禁用的 input 元素
    input:checked          选择每个被选中的 input 元素
    :not(p)                选择非 p 元素的每个元素
    ::selection            选择被用户选取的元素部分

手机端原生不支持css定位 . webview 页面支持 .
"""
from selenium.webdriver.common.by import By
from basic.s1_pytest_base import TestBase


class TestCssSelector(TestBase):

    # 使用 css_selector 定位首页输入框 , 输入内容并点击跳转 .
    def test_oo1(self):
        self.driver.get('https://www.dongchedi.com/')

        # css_selector 定位首页输入框 , 并输入 领克05
        ele_search = self.driver.find_element(By.CSS_SELECTOR, '.search-form')
        ele_search.send_keys('领克05')

        # css_selector 定位首页搜索按钮 , 并点击
        ele_go_search = self.driver.find_element(By.CSS_SELECTOR, '.tw-w-64')
        ele_go_search.click()
